/**
 * 格式化时间
 * @param {Date} date 日期对象
 * @param {String} format 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
 * @return {String} 格式化后的时间字符串
 */
const formatTime = (date, format = 'YYYY-MM-DD HH:mm:ss') => {
  if (!date) return '';
  if (typeof date === 'string') {
    date = new Date(date.replace(/-/g, '/'));
  }
  
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const second = date.getSeconds();

  const formatMap = {
    'YYYY': year,
    'MM': padZero(month),
    'DD': padZero(day),
    'HH': padZero(hour),
    'mm': padZero(minute),
    'ss': padZero(second)
  };

  return format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (match) => formatMap[match]);
};

/**
 * 格式化日期
 * @param {Date} date 日期对象
 * @return {String} 格式化后的日期字符串
 */
const formatDate = (date) => {
  return formatTime(date, 'YYYY-MM-DD');
};

/**
 * 格式化显示时间
 * @param {Date} date 日期对象
 * @return {String} 格式化后的时间字符串
 */
const formatDisplayTime = (date) => {
  return formatTime(date, 'HH:mm');
};

/**
 * 补零函数
 * @param {Number} num 数字
 * @return {String} 补零后的字符串
 */
const padZero = (num) => {
  return String(num).padStart(2, '0');
};

/**
 * 计算相对时间
 * @param {String|Date} time 时间
 * @return {String} 相对时间描述
 */
const relativeTime = (time) => {
  if (!time) return '';
  
  const now = new Date();
  const date = typeof time === 'string' ? new Date(time.replace(/-/g, '/')) : time;
  const diff = Math.floor((now - date) / 1000);
  
  if (diff < 60) {
    return '刚刚';
  } else if (diff < 3600) {
    return Math.floor(diff / 60) + '分钟前';
  } else if (diff < 86400) {
    return Math.floor(diff / 3600) + '小时前';
  } else if (diff < 604800) {
    return Math.floor(diff / 86400) + '天前';
  } else {
    return formatDate(date);
  }
};

/**
 * 防抖函数
 * @param {Function} fn 需要防抖的函数
 * @param {Number} delay 延迟时间（毫秒）
 * @return {Function} 防抖处理后的函数
 */
const debounce = (fn, delay = 300) => {
  let timer = null;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, delay);
  };
};

/**
 * 生成随机字符串
 * @param {Number} length 字符串长度
 * @return {String} 随机字符串
 */
const randomString = (length = 16) => {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
};

/**
 * 格式化金额
 * @param {Number} amount 金额（单位：分）
 * @return {String} 格式化后的金额字符串（单位：元）
 */
const formatAmount = (amount) => {
  if (amount === undefined || amount === null) return '0.00';
  return (amount / 100).toFixed(2);
};

module.exports = {
  formatTime,
  formatDate,
  formatDisplayTime,
  padZero,
  relativeTime,
  debounce,
  randomString,
  formatAmount
};
